/**
 * md5处理c++封装类
 * 
 * 开发者   : Marco
 * 创建时间 : 2016年6月1日, 下午8:39
 */

#ifndef __MARCOPP_MD5_H__
#define __MARCOPP_MD5_H__

#include "marcopp.h"

MARCOPP_NAMESPACE_BEGIN

class md5_impl;

/**
 * md5处理
 */
class md5 {
public:
    explicit md5(void);
    explicit md5(const void* data, int nbytes);
    explicit md5(const md5& ths); // 拷贝构造
#if (__cplusplus >= 201103L)
    md5(md5&& ths); // 移动构造
#endif
    
    ~md5(void);
    
    /**
     * 重新初始化
     */
    void reinit(void) MARCOPP_USE_NOEXCEPT;
    
    /**
     * 添加数据参与计算
     * @param data 数据内容
     * @param nbytes 数据长度
     */
    void append(const void* data, int nbytes) MARCOPP_USE_NOEXCEPT;

    /**
     * 计算完成, 取结果
     * @param result 结果存储区(out)
     */
    void finish(unsigned char* result) MARCOPP_USE_NOEXCEPT;

    /**
     * 计算指定的数据md5值的字节码形式
     * @param data 数据内容
     * @param nbytes 数据长度
     * @param result 结果存储区(out),至少16字节空间
     */
    static void encodeByte(const void* data, int nbytes, unsigned char* result) MARCOPP_USE_NOEXCEPT;

    /**
     * 计算指定的数据md5值的字符串形式
     * @param data 数据内容
     * @param nbytes 数据长度
     * @param result 结果存储区(out),至少33字节空间
     * @param lowercase 是否小写
     * @return 存储区首地址或NULL
     */
    static char* encodeString(const void* data, int nbytes, char* result, bool lowercase = true) MARCOPP_USE_NOEXCEPT;

    /**
     * 计算指定的文件md5值的字节码形式
     * @param pathname 文件路径
     * @param result 结果存储区(out),至少16字节空间
     * @return 1成功, 0失败(无法打开)
     */
    static int fileEncodeByte(const char *pathname, unsigned char *result) MARCOPP_USE_NOEXCEPT;

    /**
     * 计算指定的文件md5值的字符串形式
     * @param pathname 文件路径
     * @param result 结果存储区(out),至少33字节空间
     * @param lowercase 是否小写
     * @return 存储区首地址或NULL
     */
    static char* fileEncodeString(const char *pathname, char *result, bool lowercase = true) MARCOPP_USE_NOEXCEPT;

    /**
     * 赋值重载
     * @param ths 其它对象
     * @return 本对象引用
     */
    md5& operator= (const md5& ths);
    
#if (__cplusplus >= 201103L)
    md5& operator= (md5&& ths);
#endif
    
private:
    md5_impl *impl;
};

MARCOPP_NAMESPACE_END
#endif /* __MARCOPP_MD5_H__ */

